{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from pandas.core.frame import DataFrame\n",
    "import time\n",
    "from geopy.distance import geodesic\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1 测试集的trace去训练集里面寻找\n",
    "## 2根据第一条记录(真正的出发点去寻找)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#港口坐标数据\n",
    "#港口坐标数据描述每个运单在船运的过程中涉及的港口位置信息。\n",
    "port=pd.read_csv('../event_port/port.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyboardInterrupt",
     "evalue": "",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m                         Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-3-27b0d7f5abee>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m#gpsdf.shape\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[1;31m#gpsdf.to_csv('gps_sample5kw.csv',index=False)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mgpsdf_raw\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'../clean_dataset/dataHasAllXY.csv'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\envs\\huawei_copy\\lib\\site-packages\\pandas\\io\\parsers.py\u001b[0m in \u001b[0;36mparser_f\u001b[1;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)\u001b[0m\n\u001b[0;32m    674\u001b[0m         )\n\u001b[0;32m    675\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 676\u001b[1;33m         \u001b[1;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    677\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    678\u001b[0m     \u001b[0mparser_f\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__name__\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mname\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\envs\\huawei_copy\\lib\\site-packages\\pandas\\io\\parsers.py\u001b[0m in \u001b[0;36m_read\u001b[1;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[0;32m    452\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    453\u001b[0m     \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 454\u001b[1;33m         \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mparser\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnrows\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    455\u001b[0m     \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    456\u001b[0m         \u001b[0mparser\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mclose\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\envs\\huawei_copy\\lib\\site-packages\\pandas\\io\\parsers.py\u001b[0m in \u001b[0;36mread\u001b[1;34m(self, nrows)\u001b[0m\n\u001b[0;32m   1131\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mread\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnrows\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1132\u001b[0m         \u001b[0mnrows\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0m_validate_integer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"nrows\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnrows\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1133\u001b[1;33m         \u001b[0mret\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnrows\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   1134\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   1135\u001b[0m         \u001b[1;31m# May alter columns / col_dict\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\envs\\huawei_copy\\lib\\site-packages\\pandas\\io\\parsers.py\u001b[0m in \u001b[0;36mread\u001b[1;34m(self, nrows)\u001b[0m\n\u001b[0;32m   2035\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0mread\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnrows\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2036\u001b[0m         \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2037\u001b[1;33m             \u001b[0mdata\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_reader\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnrows\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2038\u001b[0m         \u001b[1;32mexcept\u001b[0m \u001b[0mStopIteration\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2039\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_first_chunk\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader.read\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._read_low_memory\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._read_rows\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._convert_column_data\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._convert_tokens\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._convert_with_dtype\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32m~\\AppData\\Local\\Continuum\\anaconda3\\envs\\huawei_copy\\lib\\site-packages\\pandas\\core\\dtypes\\common.py\u001b[0m in \u001b[0;36mis_categorical_dtype\u001b[1;34m(arr_or_dtype)\u001b[0m\n\u001b[0;32m    540\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m    541\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 542\u001b[1;33m \u001b[1;32mdef\u001b[0m \u001b[0mis_categorical_dtype\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0marr_or_dtype\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m->\u001b[0m \u001b[0mbool\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m    543\u001b[0m     \"\"\"\n\u001b[0;32m    544\u001b[0m     \u001b[0mCheck\u001b[0m \u001b[0mwhether\u001b[0m \u001b[0man\u001b[0m \u001b[0marray\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mlike\u001b[0m \u001b[1;32mor\u001b[0m \u001b[0mdtype\u001b[0m \u001b[1;32mis\u001b[0m \u001b[0mof\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mCategorical\u001b[0m \u001b[0mdtype\u001b[0m\u001b[1;33m.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;31mKeyboardInterrupt\u001b[0m: "
     ]
    }
   ],
   "source": [
    "#gpsdf.shape\n",
    "#gpsdf.to_csv('gps_sample5kw.csv',index=False)\n",
    "gpsdf_raw=pd.read_csv('../clean_dataset/dataHasAllXY.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "gpsdf_raw.clo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 762,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finished.........\n"
     ]
    }
   ],
   "source": [
    "#对数据进行预处理\n",
    "def get_data(data, mode='train'):\n",
    "    \n",
    "    assert mode=='train' or mode=='test'\n",
    "    \n",
    "    if mode=='train':#船舶将要到达的下一个港口的预计时间,转码格式\n",
    "        pass\n",
    "    elif mode=='test':\n",
    "        data['temp_timestamp'] = data['timestamp']#当前时间\n",
    "        data['onboardDate'] = pd.to_datetime(data['onboardDate'], infer_datetime_format=True)#离开起运港时间\n",
    "    data['timestamp'] = pd.to_datetime(data['timestamp'], infer_datetime_format=True)\n",
    "    data['longitude'] = data['longitude'].astype(float)\n",
    "    data['loadingOrder'] = data['loadingOrder'].astype(str)\n",
    "    data['latitude'] = data['latitude'].astype(float)\n",
    "    data['speed'] = data['speed'].astype(float)\n",
    "    data['direction'] = data['direction'].astype(float)\n",
    "\n",
    "    return data\n",
    "#gpsdf = get_data(gpsdf_raw, mode='train')\n",
    "print('finished.........')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "#\n",
    "test_data_path='../R2 ATest 0711.csv'\n",
    "df_test=pd.read_csv(test_data_path)\n",
    "df_test=get_data(df_test, mode='test')\n",
    "def convert_name_xy(name):#输入港口名称\n",
    "    port_name=port[port['TRANS_NODE_NAME'].isin([name])].reset_index()\n",
    "    return port_name['LONGITUDE'][0],port_name['LATITUDE'][0]#返回港口经纬度\n",
    "#  \n",
    "start_x=[]#起点\n",
    "start_y=[]#起点\n",
    "end_x=[]#终点\n",
    "end_y=[]#终点\n",
    "#存储中间结果,避免重复计算\n",
    "temp_dic={}\n",
    "for value in df_test['TRANSPORT_TRACE']:\n",
    "    s_e=value.split('-')\n",
    "    start_port=s_e[0]\n",
    "    end_port=s_e[-1]\n",
    "    if start_port in temp_dic:\n",
    "        re=temp_dic[start_port]\n",
    "    else:\n",
    "        re=convert_name_xy(start_port)\n",
    "        temp_dic[start_port]=re\n",
    "    start_x.append(re[0])\n",
    "    start_y.append(re[1])\n",
    "    if end_port in temp_dic:\n",
    "        re=temp_dic[end_port]\n",
    "    else:\n",
    "        re=convert_name_xy(end_port)\n",
    "        temp_dic[end_port]=re\n",
    "    end_x.append(re[0])\n",
    "    end_y.append(re[1])\n",
    "df_test['start_x']=start_x\n",
    "df_test['start_y']=start_y\n",
    "df_test['end_x']=end_x\n",
    "df_test['end_y']=end_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12148"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(gpsdf['loadingOrder'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "grouped=df_test.groupby('loadingOrder')\n",
    "testStartsXY=[]\n",
    "testEndXY=[]\n",
    "for name,group in grouped:\n",
    "    group=group.reset_index(drop=True)\n",
    "    x,y=group['longitude'].values[0],group['latitude'].values[0]\n",
    "    testStartsXY.append((x,y))#测试集的每一条运单的第一条记录发生地点\n",
    "    x,y=group['end_x'].values[0],group['end_y'].values[0]\n",
    "    testEndXY.append((x,y))\n",
    "len(testStartsXY),len(testEndXY)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1000\n",
      "2000\n",
      "3000\n",
      "4000\n",
      "5000\n",
      "6000\n",
      "7000\n",
      "8000\n",
      "9000\n",
      "10000\n",
      "11000\n",
      "12000\n",
      "finished.........\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "6642"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def matchs(x,y):\n",
    "    for x_t,y_t in testStartsXY:\n",
    "        s=geodesic((y,x), (y_t,x_t)).km\n",
    "        if s<50:\n",
    "            return True\n",
    "    return False\n",
    "def matche(x,y):\n",
    "    for x_t,y_t in testEndXY:\n",
    "        s=geodesic((y,x), (y_t,x_t)).km\n",
    "        if s<50:\n",
    "            return True\n",
    "    return False\n",
    "    \n",
    "grouped=gpsdf.groupby('loadingOrder')\n",
    "reserve_names=[]\n",
    "cnt=0\n",
    "for name,group in grouped:\n",
    "    cnt+=1\n",
    "    if cnt%1000==0:\n",
    "        print(cnt)\n",
    "    group=group.reset_index(drop=True)\n",
    "    x0,y0=group['longitude'].values[0],group['latitude'].values[0]\n",
    "    x1,y1=group['longitude'].values[-1],group['latitude'].values[-1]\n",
    "    \n",
    "    if matchs(x0,y0) and matche(x1,y1):\n",
    "        reserve_names.append(name)\n",
    "gpsdf=gpsdf[gpsdf['loadingOrder'].isin(reserve_names)]\n",
    "gpsdf=gpsdf.reset_index(drop=True)\n",
    "print('finished.........')\n",
    "len(reserve_names)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 763,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#gpsdf.to_csv(\"筛选的训练data.csv\",index=False)\n",
    "gpsdf=pd.read_csv(\"筛选的训练data.csv\")\n",
    "gpsdf = get_data(gpsdf, mode='train')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 764,
   "metadata": {},
   "outputs": [],
   "source": [
    "#清洗训练数据(针对标签的清洗，因为有很多运单中间大量停船过程)\n",
    "grouped=gpsdf.groupby('loadingOrder')\n",
    "cnt_maxtime=[]\n",
    "reserve_name=[]\n",
    "for name,group in grouped:\n",
    "    group=group.reset_index(drop=True)\n",
    "    time_dif=group['timestamp'].diff(1).dt.total_seconds()//3600#小时为单位\n",
    "    time_dif=time_dif.values[1:]\n",
    "    if len(time_dif)<50:\n",
    "        reserve_name.append(name)\n",
    "        continue\n",
    "    cnt_maxtime.append(np.max(time_dif))\n",
    "    if np.max(time_dif)<10:#跳跃小于10个小时的用于训练\n",
    "        reserve_name.append(name)\n",
    "    #break\n",
    "gpsdf=gpsdf[gpsdf['loadingOrder'].isin(reserve_name)]\n",
    "gpsdf=gpsdf.reset_index(drop=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 765,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10.0"
      ]
     },
     "execution_count": 765,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sorted(cnt_maxtime,reverse=True)[3000]#可以看到，最大的时间间隔已经是952个小时，这种运单显然不对"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 766,
   "metadata": {},
   "outputs": [],
   "source": [
    "grouped=gpsdf.groupby('loadingOrder')\n",
    "cnt_turn=[]\n",
    "for name,group in grouped:\n",
    "    group=group.reset_index(drop=True)\n",
    "    trace=group['TRANSPORT_TRACE'].values[0]\n",
    "    trace=trace.split('-')\n",
    "    cnt_turn.append(len(trace)-2)\n",
    "    #print(trace)\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 904,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "正在构造训练数据\n",
      "构造训练特征所花费时间54.874s\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "import datetime\n",
    "from geopy.distance import geodesic\n",
    "#\n",
    "def cut_zero_end(data):\n",
    "    for i in range(len(data)-1,0,-1):\n",
    "        if data[i]!=0:\n",
    "            break\n",
    "    return i+1\n",
    "def cut_zero_start(data):\n",
    "    for i in range(len(data)):\n",
    "        if data[i]!=0:\n",
    "            break\n",
    "    return i-1\n",
    "#\n",
    "def convert_name_xy(name):#输入港口名称\n",
    "    port_name=port[port['TRANS_NODE_NAME'].isin([name])].reset_index()\n",
    "    return port_name['LONGITUDE'][0],port_name['LATITUDE'][0]#返回港口经纬度\n",
    "\n",
    "def get_train_feature(df):\n",
    "    #\n",
    "    #构建年份,月份特征\n",
    "    y_m=str(df['timestamp'].values[0])\n",
    "    year=int(y_m.split('-')[0])\n",
    "    month=y_m.split('-')[1]\n",
    "    if month[0]=='0':\n",
    "        month=int(month[1])\n",
    "    else:\n",
    "        month=int(month)\n",
    "    #\n",
    "    portNames=df['TRANSPORT_TRACE'].values[0]\n",
    "    portNames=portNames.split('-')\n",
    "    cnt_turn=len(portNames)-2\n",
    "    data=list(df['speed'])\n",
    "    cut_start=0\n",
    "    cut_end=len(df)\n",
    "    #if data[0]==0:\n",
    "        #cut_start=cut_zero_start(data)\n",
    "    if data[-1]==0:\n",
    "        cut_end=cut_zero_end(data)\n",
    "    df=df[cut_start:cut_end].reset_index(drop=True)\n",
    "    if len(df)<10:\n",
    "        return [0 for i in range(39)]\n",
    "    feature=[]\n",
    "    length=len(df)\n",
    "    sx=df['longitude'][0]\n",
    "    sy=df['latitude'][0]\n",
    "    ex=df['longitude'][length-1]\n",
    "    ey=df['latitude'][length-1]\n",
    "    \n",
    "    dis=geodesic((sy,sx), (ey,ex)).km\n",
    "    lon_dis=abs(ex-sx)\n",
    "    lat_dis=abs(ey-sy)\n",
    "    dis_sqrt=np.sqrt(lon_dis*lon_dis+lat_dis*lat_dis)\n",
    "    \n",
    "    dir_k=lat_dis/lon_dis\n",
    "    label=(df['timestamp'][length-1]-df['timestamp'][0]).total_seconds()/3600\n",
    "    #下面开始截断\n",
    "    if length<200:\n",
    "        cut_ratio=0.5\n",
    "    else:\n",
    "        cut_ratio=random.choice([0.1,0.15,0.2,0.25,0.3])\n",
    "        #cut_ratio=random.choice([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8])\n",
    "    df=df[:int(length*cut_ratio)]\n",
    "    \n",
    "    length=len(df)\n",
    "    dsx=df['longitude'][0]\n",
    "    dsy=df['latitude'][0]\n",
    "    dex=df['longitude'][length-1]\n",
    "    dey=df['latitude'][length-1]\n",
    "    cal_dis=geodesic((dsy,dsx), (dey,dex)).km#截取出来的一段距离\n",
    "    cut_label=(df['timestamp'][length-1]-df['timestamp'][0]).total_seconds()/3600\n",
    "    \n",
    "    cal_speed=cal_dis/(cut_label+0.1)\n",
    "\n",
    "    df['lat_diff']=df['latitude'].diff(1)\n",
    "    df['lon_diff']=df['longitude'].diff(1)\n",
    "    df['k']=df['lat_diff']/df['lon_diff']\n",
    "    #\n",
    "    df['speed_diff'] = df['speed'].diff(1)#速度变化量\n",
    "    df['diff_minutes'] =df['timestamp'].diff(1).dt.total_seconds() / 60#记录之间的间隔时间(单位:s)\n",
    "    #\n",
    "    k_1_4=df['k'].quantile(0.25)\n",
    "    k_median=df['k'].quantile(0.5)\n",
    "    k_3_4=df['k'].quantile(0.75)\n",
    "    #在所有的记录中，多少记录是停船状态\n",
    "    #df['anchor'] = ((df['lat_diff'] <= 0.03) & (df['lon_diff'] <= 0.03)& (df['speed_diff'] <= 0.3) & (df['diff_minutes'] <= 10)).astype(int)\n",
    "    df['anchor'] = ((df['lat_diff'].abs() <= 0.03) & (df['lon_diff'].abs() <= 0.03)& (df['speed_diff'] <= 0.3) & (df['diff_minutes'] >= 10)).astype(int)\n",
    "\n",
    "    anchor_cnt = df['anchor'].sum()\n",
    "    anchor_ratio = anchor_cnt / len(df)\n",
    "    \n",
    "    \n",
    "    #\n",
    "    lat_1_4=df['latitude'].quantile(0.25)\n",
    "    lat_3_4=df['latitude'].quantile(0.75)\n",
    "    lat_min=df['latitude'].min()\n",
    "    lat_max=df['latitude'].max()\n",
    "    lat_mean=df['latitude'].mean()\n",
    "    lat_median=df['latitude'].median()\n",
    "    #\n",
    "    lon_1_4=df['longitude'].quantile(0.25)\n",
    "    lon_3_4=df['longitude'].quantile(0.75)\n",
    "    longitude_1_4=df['longitude'].quantile(0.25)\n",
    "    longitude_3_4=df['longitude'].quantile(0.75)\n",
    "    lon_min=df['longitude'].min()\n",
    "    lon_max=df['longitude'].max()\n",
    "    lon_mean=df['longitude'].mean()\n",
    "    lon_median=df['longitude'].median()\n",
    "    #\n",
    "    speed_1_4=df['speed'].quantile(0.25)\n",
    "    speed_3_4=df['speed'].quantile(0.75)\n",
    "    speed_max=df['speed'].max()\n",
    "    speed_mean=df['speed'].mean()\n",
    "    speed_median=df['speed'].median()\n",
    "    #\n",
    "    direction_1_4=df['direction'].quantile(0.25)\n",
    "    direction_3_4=df['direction'].quantile(0.75)\n",
    "    direction_min=df['direction'].min()\n",
    "    direction_max=df['direction'].max()\n",
    "    direction_mean=df['direction'].mean()\n",
    "    direction_median=df['direction'].median()\n",
    "    #\n",
    "    feature.append(k_1_4)\n",
    "    feature.append(k_3_4)\n",
    "    feature.append(k_median)\n",
    "    feature.append(anchor_cnt)\n",
    "    feature.append(anchor_ratio)\n",
    "    #\n",
    "    feature.append(lat_1_4)\n",
    "    feature.append(lat_3_4)\n",
    "    feature.append(lat_max)\n",
    "    feature.append(lat_min)\n",
    "    feature.append(lat_median)\n",
    "    feature.append(lat_mean)\n",
    "    #\n",
    "    feature.append(lon_1_4)\n",
    "    feature.append(lon_3_4)\n",
    "    feature.append(lon_max)\n",
    "    feature.append(lon_min)\n",
    "    feature.append(lon_median)\n",
    "    feature.append(lon_mean)\n",
    "    #\n",
    "    feature.append(speed_1_4)\n",
    "    feature.append(speed_3_4)\n",
    "    feature.append(speed_max)\n",
    "    feature.append(speed_median)\n",
    "    feature.append(speed_mean)\n",
    "    #\n",
    "    feature.append(direction_1_4)\n",
    "    feature.append(direction_3_4)\n",
    "    feature.append(direction_max)\n",
    "    feature.append(direction_min)\n",
    "    feature.append(direction_median)\n",
    "    feature.append(direction_mean)\n",
    "    #\n",
    "    feature.append(sx)\n",
    "    feature.append(sy)\n",
    "    feature.append(ex)\n",
    "    feature.append(ey)\n",
    "    feature.append(dis)\n",
    "    feature.append(lon_dis)\n",
    "    feature.append(lat_dis)\n",
    "    feature.append(cal_speed)\n",
    "    feature.append(dis_sqrt)\n",
    "    feature.append(cnt_turn)\n",
    "    feature.append(year)\n",
    "    feature.append(month)\n",
    "    feature.append(abs(dir_k))\n",
    "    feature.append(label)\n",
    "\n",
    "    return feature\n",
    "#\n",
    "import random\n",
    "from geopy.distance import geodesic\n",
    "import time\n",
    "def make_train_data(df):\n",
    "    features=[]\n",
    "    grouped=df.groupby('loadingOrder')\n",
    "    #\n",
    "    start_time=time.time()\n",
    "    print('正在构造训练数据')\n",
    "    start_time=time.time()\n",
    "    for name,group in grouped:\n",
    "        #sample_trace=df.loc[group.index[bottom:top+1]].reset_index(drop=True)#这里的sample_trace是截取出的一段轨迹(一个训练样本)\n",
    "        sample_trace=group.reset_index(drop=True)\n",
    "        features.append(get_train_feature(sample_trace))\n",
    "    print(\"构造训练特征所花费时间%.3fs\"%(time.time()-start_time))\n",
    "    return features\n",
    "#\n",
    "train_features=make_train_data(gpsdf)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 观察训练数据标签的分布\n",
    "- 最长时间:86.28858796296296 day\n",
    "- 最短时间:0.0 day\n",
    "- 平均时间:16.70094809971483 day\n",
    "\n",
    "## 而测试数据中已知的轨迹长度为：\n",
    "- 最长时间:16.88171296296296 day\n",
    "- 最短时间:0.046527777777777786 day\n",
    "- 平均时间:4.325498415081749 day\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 905,
   "metadata": {},
   "outputs": [],
   "source": [
    "#\n",
    "test_data_path='../R2 ATest 0711Clean.csv'\n",
    "df_test=pd.read_csv(test_data_path)\n",
    "df_test=get_data(df_test, mode='test')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 906,
   "metadata": {},
   "outputs": [],
   "source": [
    "#df_test[df_test['loadingOrder'].isin(['KD265061648304'])]#1-12日出发，1-16开始截取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 907,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "SZ109188860665 1.0\n",
      "NH240192470616 3.0\n",
      "JB123387157454 3.0\n",
      "ZO975754571124 3.0\n",
      "DH829189593918 105.0\n",
      "80 105.0\n",
      "LE381377964668 68.0\n",
      "89 68.0\n",
      "ZX552539758501 1.0\n",
      "TB846768731403 4.0\n",
      "HQ193237808500 1.0\n",
      "QK696918637480 8.0\n"
     ]
    }
   ],
   "source": [
    "#判断onboard_time和第一条记录的时间是否相等\n",
    "#总共10个运单的onboard/第一条时间差距大于一个小时，大于一天的有两个运单\n",
    "#'DH829189593918':105h;'LE381377964668':68.0\n",
    "grouped=df_test.groupby('loadingOrder',sort=False)\n",
    "cnt=0\n",
    "for name,group in grouped:\n",
    "    group=group.reset_index(drop=True)\n",
    "    dft=pd.to_datetime(group['timestamp'] ).apply(lambda x: x.replace(tzinfo=None))\n",
    "    delta=(dft[:1][0]-group['onboardDate'][:1][0]).total_seconds()//3600\n",
    "    if delta!=0:\n",
    "        print(name,delta)#总共10个运单的onboard和第一条时间戳不一致\n",
    "    if name=='DH829189593918' or name=='LE381377964668':\n",
    "        print(cnt,delta)\n",
    "    cnt+=1\n",
    "#这里面的10个不一致的订单是需要最好减掉的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 908,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"\\nlen_list=[]\\ndelta=[]\\ngrouped=df_test.groupby('loadingOrder')\\nfor name,group in grouped:\\n    len_list.append(len(group))\\n    group=group.reset_index(drop=True)\\n    tmp=group['timestamp'].values\\n    delta.append(pd.Timedelta((tmp[-1]-tmp[1])).total_seconds()/3600/24)\\n    if len(group)<10:\\n        print(name)\\n\\nprint(np.min(len_list),np.mean(len_list),np.max(len_list))\\n    \\nprint(np.min(delta),np.mean(delta),np.max(delta))\\n\""
      ]
     },
     "execution_count": 908,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''\n",
    "len_list=[]\n",
    "delta=[]\n",
    "grouped=df_test.groupby('loadingOrder')\n",
    "for name,group in grouped:\n",
    "    len_list.append(len(group))\n",
    "    group=group.reset_index(drop=True)\n",
    "    tmp=group['timestamp'].values\n",
    "    delta.append(pd.Timedelta((tmp[-1]-tmp[1])).total_seconds()/3600/24)\n",
    "    if len(group)<10:\n",
    "        print(name)\n",
    "\n",
    "print(np.min(len_list),np.mean(len_list),np.max(len_list))\n",
    "    \n",
    "print(np.min(delta),np.mean(delta),np.max(delta))\n",
    "'''\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 909,
   "metadata": {},
   "outputs": [],
   "source": [
    "#sorted(len_list)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 测试数据:共94对(31对中间港口，最多中间港有14个)港口，219条运单，其中很多含有中间港口"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 910,
   "metadata": {},
   "outputs": [],
   "source": [
    "def convert_name_xy(name):#输入港口名称\n",
    "    port_name=port[port['TRANS_NODE_NAME'].isin([name])].reset_index()\n",
    "    return port_name['LONGITUDE'][0],port_name['LATITUDE'][0]#返回港口经纬度\n",
    "#  \n",
    "start_x=[]#起点\n",
    "start_y=[]#起点\n",
    "end_x=[]#终点\n",
    "end_y=[]#终点\n",
    "#存储中间结果,避免重复计算\n",
    "temp_dic={}\n",
    "for value in df_test['TRANSPORT_TRACE']:\n",
    "    s_e=value.split('-')\n",
    "    start_port=s_e[0]\n",
    "    end_port=s_e[-1]\n",
    "    if start_port in temp_dic:\n",
    "        re=temp_dic[start_port]\n",
    "    else:\n",
    "        re=convert_name_xy(start_port)\n",
    "        temp_dic[start_port]=re\n",
    "    start_x.append(re[0])\n",
    "    start_y.append(re[1])\n",
    "    if end_port in temp_dic:\n",
    "        re=temp_dic[end_port]\n",
    "    else:\n",
    "        re=convert_name_xy(end_port)\n",
    "        temp_dic[end_port]=re\n",
    "    end_x.append(re[0])\n",
    "    end_y.append(re[1])\n",
    "df_test['start_x']=start_x\n",
    "df_test['start_y']=start_y\n",
    "df_test['end_x']=end_x\n",
    "df_test['end_y']=end_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 911,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finished1...\n",
      "正在构造测试数据........\n",
      "构造测试数据所花费时间2.678s\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "from geopy.distance import geodesic\n",
    "#\n",
    "def get_test_feature(df,name):\n",
    "    #\n",
    "    y_m=str(df['timestamp'].values[0])\n",
    "    year=int(y_m.split('-')[0])\n",
    "    month=y_m.split('-')[1]\n",
    "    if month[0]=='0':\n",
    "        month=int(month[1])\n",
    "    else:\n",
    "        month=int(month)\n",
    "    #\n",
    "    portNames=df['TRANSPORT_TRACE'].values[0]\n",
    "    portNames=portNames.split('-')\n",
    "    cnt_turn=len(portNames)-2\n",
    "    df.sort_values(['timestamp'], inplace=True)\n",
    "    df=df.reset_index(drop=True)\n",
    "    feature=[]\n",
    "    length=len(df)\n",
    "    dsx=df['longitude'][0]\n",
    "    dsy=df['latitude'][0]\n",
    "    dex=df['longitude'][length-1]\n",
    "    dey=df['latitude'][length-1]\n",
    "    #\n",
    "    sx=df['longitude'][0]#df['start_x'][0]\n",
    "    sy=df['latitude'][0]#df['start_y'][0]\n",
    "    ex=df['end_x'][length-1]\n",
    "    ey=df['end_y'][length-1]\n",
    "    \n",
    "    dis=geodesic((sy,sx), (ey,ex)).km\n",
    "    lon_dis=abs(ex-sx)\n",
    "    lat_dis=abs(ey-sy)\n",
    "    dis_sqrt=np.sqrt(lon_dis*lon_dis+lat_dis*lat_dis)\n",
    "    \n",
    "    dir_k=lat_dis/lon_dis\n",
    "    \n",
    "    label=(df['timestamp'][length-1]-df['timestamp'][0]).total_seconds()/3600\n",
    "    cal_dis=geodesic((dsy,dsx), (dey,dex)).km\n",
    "    cal_speed=cal_dis/(label+0.1)\n",
    "    df['lat_diff']=df['latitude'].diff(1)\n",
    "    df['lon_diff']=df['longitude'].diff(1)\n",
    "    df['k']=df['lat_diff']/df['lon_diff']\n",
    "    #\n",
    "    df['speed_diff'] = df['speed'].diff(1)#速度变化量\n",
    "    df['diff_minutes'] =df['timestamp'].diff(1).dt.total_seconds() / 60#记录之间的间隔时间(单位:s)\n",
    "    #\n",
    "    k_1_4=df['k'].quantile(0.25)\n",
    "    k_median=df['k'].quantile(0.5)\n",
    "    k_3_4=df['k'].quantile(0.75)\n",
    "    #在所有的记录中，多少记录是停船状态\n",
    "    df['anchor'] = ((df['lat_diff'].abs() <= 0.03) & (df['lon_diff'].abs() <= 0.03)& (df['speed_diff'] <= 0.3) & (df['diff_minutes'] >= 15)).astype(int)\n",
    "\n",
    "    anchor_cnt = df['anchor'].sum()\n",
    "    anchor_ratio = anchor_cnt / len(df)\n",
    "    #\n",
    "    lat_1_4=df['latitude'].quantile(0.25)\n",
    "    lat_3_4=df['latitude'].quantile(0.75)\n",
    "    lat_min=df['latitude'].min()\n",
    "    lat_max=df['latitude'].max()\n",
    "    lat_mean=df['latitude'].mean()\n",
    "    lat_median=df['latitude'].median()\n",
    "    #\n",
    "    lon_1_4=df['longitude'].quantile(0.25)\n",
    "    lon_3_4=df['longitude'].quantile(0.75)\n",
    "    longitude_1_4=df['longitude'].quantile(0.25)\n",
    "    longitude_3_4=df['longitude'].quantile(0.75)\n",
    "    lon_min=df['longitude'].min()\n",
    "    lon_max=df['longitude'].max()\n",
    "    lon_mean=df['longitude'].mean()\n",
    "    lon_median=df['longitude'].median()\n",
    "    #\n",
    "    speed_1_4=df['speed'].quantile(0.25)\n",
    "    speed_3_4=df['speed'].quantile(0.75)\n",
    "    speed_min=df['speed'].min()\n",
    "    speed_max=df['speed'].max()\n",
    "    speed_mean=df['speed'].mean()\n",
    "    speed_median=df['speed'].median()\n",
    "    #\n",
    "    direction_1_4=df['direction'].quantile(0.25)\n",
    "    direction_3_4=df['direction'].quantile(0.75)\n",
    "    direction_min=df['direction'].min()\n",
    "    direction_max=df['direction'].max()\n",
    "    direction_mean=df['direction'].mean()\n",
    "    direction_median=df['direction'].median()\n",
    "    #\n",
    "    feature.append(name)\n",
    "    feature.append(k_1_4)\n",
    "    feature.append(k_3_4)\n",
    "    feature.append(k_median)\n",
    "    feature.append(anchor_cnt)\n",
    "    feature.append(anchor_ratio)\n",
    "    #\n",
    "    feature.append(lat_1_4)\n",
    "    feature.append(lat_3_4)\n",
    "    feature.append(lat_max)\n",
    "    feature.append(lat_min)\n",
    "    feature.append(lat_median)\n",
    "    feature.append(lat_mean)\n",
    "    #\n",
    "    feature.append(lon_1_4)\n",
    "    feature.append(lon_3_4)\n",
    "    feature.append(lon_max)\n",
    "    feature.append(lon_min)\n",
    "    feature.append(lon_median)\n",
    "    feature.append(lon_mean)\n",
    "    #\n",
    "    feature.append(speed_1_4)\n",
    "    feature.append(speed_3_4)\n",
    "    feature.append(speed_max)\n",
    "    feature.append(speed_median)\n",
    "    feature.append(speed_mean)\n",
    "    #\n",
    "    feature.append(direction_1_4)\n",
    "    feature.append(direction_3_4)\n",
    "    feature.append(direction_max)\n",
    "    feature.append(direction_min)\n",
    "    feature.append(direction_median)\n",
    "    feature.append(direction_mean)\n",
    "    #\n",
    "    feature.append(sx)\n",
    "    feature.append(sy)\n",
    "    feature.append(ex)\n",
    "    feature.append(ey)\n",
    "    feature.append(dis)\n",
    "    feature.append(lon_dis)\n",
    "    feature.append(lat_dis)\n",
    "    feature.append(cal_speed)\n",
    "    feature.append(dis_sqrt)\n",
    "    feature.append(cnt_turn)\n",
    "    feature.append(year)\n",
    "    feature.append(month)\n",
    "    feature.append(abs(dir_k))\n",
    "    feature.append(label)\n",
    "    \n",
    "    return feature\n",
    "#\n",
    "import random\n",
    "from geopy.distance import geodesic\n",
    "import time\n",
    "def make_test_data(df):\n",
    "    features=[]\n",
    "    grouped=df.groupby('loadingOrder',sort=False)\n",
    "    print('finished1...')\n",
    "    #\n",
    "    start_time=time.time()\n",
    "    print('正在构造测试数据........')\n",
    "    start_time=time.time()\n",
    "    for name,group in grouped:\n",
    "        #\n",
    "        sample_trace=group.reset_index(drop=True)\n",
    "        features.append(get_test_feature(sample_trace,name))\n",
    "    print(\"构造测试数据所花费时间%.3fs\"%(time.time()-start_time))\n",
    "    return features\n",
    "#下面只需要保留原始数据cut之前的数据\n",
    "test_features=make_test_data(df_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 912,
   "metadata": {},
   "outputs": [],
   "source": [
    "train=DataFrame(train_features)\n",
    "train.columns=['k_1_4','k_3_4','k_median','anchor_cnt','anchor_ratio','lat_1_4','lat_3_4','lat_max','lat_min'\n",
    "    ,'lat_median','lat_mean','lon_1_4','lon_3_4','lon_max','lon_min','lon_median','lon_mean'\n",
    "    'speed_1_4','speed_3_4','speed_min','speed_max','speed_median','speed_mean','direction_1_4','direction_3_4','direction_max'\n",
    "    ,'direction_min','direction_median','direction_mean','sx','sy','ex','ey'\n",
    "    ,'dis','lon_dis','lat_dis','cal_speed','dis_sqrt','cnt_turn','year','month','dir_k','label']\n",
    "train=train[train['label']>0.02*24]#筛选训练样本，0.05天以内的不予考虑\n",
    "train=train[train['label']<80*24]\n",
    "train.shape\n",
    "test=DataFrame(test_features)\n",
    "test.columns=['loadingOrder','k_1_4','k_3_4','k_median','anchor_cnt','anchor_ratio','lat_1_4','lat_3_4','lat_max','lat_min'\n",
    "    ,'lat_median','lat_mean','lon_1_4','lon_3_4','lon_max','lon_min','lon_median','lon_mean'\n",
    "    'speed_1_4','speed_3_4','speed_min','speed_max','speed_median','speed_mean','direction_1_4','direction_3_4','direction_max'\n",
    "    ,'direction_min','direction_median','direction_mean','sx','sy','ex','ey'\n",
    "    ,'dis','lon_dis','lat_dis','cal_speed','dis_sqrt','cnt_turn','year','month','dir_k','label']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 913,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最长时间:50.528182870370365 day\n",
      "最短时间:0.023506944444444445 day\n",
      "平均时间:16.74551449141875 day\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "train_label=np.array(train['label']/24)\n",
    "\n",
    "##观察下预测结果的分布\n",
    "name_cnt={}#{订单号：对应的事件记录条数}\n",
    "tmp=[]\n",
    "print(\"最长时间:%s day\"%(np.max(train_label)))\n",
    "print(\"最短时间:%s day\"%np.min(train_label))\n",
    "print(\"平均时间:%s day\"%np.mean(train_label))\n",
    "#画出分布直方图\n",
    "import pylab as plt \n",
    "bins = np.linspace(int(min(train_label)),int(max(train_label)),int(max(train_label)))\n",
    "plt.hist(train_label,bins)\n",
    "plt.xlabel('ETA of orders ')\n",
    "plt.ylabel('Number of orders')\n",
    "plt.title('train lables')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 观察下测试集中给了多少天的轨迹数据\n",
    "- 最长时间:16.88171296296296 day\n",
    "- 最短时间:0.046527777777777786 day\n",
    "- 平均时间:4.325498415081749 day"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 914,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最长时间:26.122685185185187 day\n",
      "最短时间:0.004050925925925926 day\n",
      "平均时间:2.532971064814815 day\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#观察下测试集中给了多少天的轨迹数据\n",
    "test_label=np.array(test['label']/24)\n",
    "##观察下预测结果的分布\n",
    "name_cnt={}#{订单号：对应的事件记录条数}\n",
    "tmp=[]\n",
    "print(\"最长时间:%s day\"%(np.max(test_label)))\n",
    "print(\"最短时间:%s day\"%np.min(test_label))\n",
    "print(\"平均时间:%s day\"%np.mean(test_label))\n",
    "#画出分布直方图\n",
    "import pylab as plt \n",
    "bins = np.linspace(int(min(test_label)),int(max(test_label)),int(max(test_label)))\n",
    "plt.hist(test_label,bins)\n",
    "plt.xlabel('ETA of orders ')\n",
    "plt.ylabel('Number of orders')\n",
    "plt.title('test lables')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 搭建训练模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## xgb+lgb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 915,
   "metadata": {},
   "outputs": [],
   "source": [
    "import xgboost as xgb\n",
    "import lightgbm as lgb\n",
    "from sklearn.ensemble import RandomForestRegressor\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "from sklearn.model_selection import train_test_split\n",
    "import pandas as pd\n",
    "from tqdm import tqdm\n",
    "import numpy as np\n",
    "from sklearn import linear_model\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.metrics import mean_squared_error,explained_variance_score\n",
    "from sklearn.model_selection import KFold\n",
    "from matplotlib import pyplot as plt\n",
    "#from featexp import get_univariate_plots#用于特征筛选，需要先安装featexp\n",
    "%matplotlib inline\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 967,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((3619, 38), (200, 38))"
      ]
     },
     "execution_count": 967,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#\n",
    "features =['k_1_4','k_3_4','k_median','anchor_ratio','lat_1_4','lat_3_4','lat_max','lat_min'\n",
    "    ,'lat_median','lat_mean','lon_1_4','lon_3_4','lon_max','lon_min','lon_median','lon_mean'\n",
    "    'speed_1_4','speed_3_4','speed_min','speed_max','speed_median','speed_mean','direction_1_4','direction_3_4','direction_max'\n",
    "    ,'direction_min','direction_median','direction_mean','sx','sy','ex','ey'\n",
    "    ,'dis','lon_dis','lat_dis','cal_speed','dis_sqrt','month','cnt_turn']\n",
    "train_data=train[features]\n",
    "test_data=test[features]\n",
    "y=train['label']\n",
    "train_data.shape,test_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 957,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((3619, 17), (200, 17))"
      ]
     },
     "execution_count": 957,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "\n",
    "features =['lat_1_4', 'anchor_ratio', 'lon_max', 'direction_3_4', 'ex',\n",
    "       'k_median', 'lon_dis', 'direction_1_4', 'sy', 'k_3_4',\n",
    "       'direction_max', 'ey', 'speed_mean', 'dis', 'k_1_4', 'sx',\n",
    "       'lat_dis', 'cal_speed']\n",
    "train_data=train[features]\n",
    "test_data=test[features]\n",
    "y=train['label']\n",
    "train_data.shape,test_data.shape\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 958,
   "metadata": {},
   "outputs": [],
   "source": [
    "#featuresx=[ 'dis','lon_dis','lat_dis','cal_speed']\n",
    "#train_data=train_data[featuresx]\n",
    "#test_data=test_data[featuresx]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 959,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"pseudo_label=pd.Series(np.load('../submit/3_5k.npy'))\\npseudo_X=pd.concat((train_data,test_data))\\npseudo_X=pseudo_X.reset_index(drop=True)\\npseudo_y=pd.concat((y,pseudo_label))\\npseudo_y=pseudo_y.reset_index(drop=True)\\ny=pseudo_y\\ntrain_data=pseudo_X\\n\\n\""
      ]
     },
     "execution_count": 959,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "'''pseudo_label=pd.Series(np.load('../submit/3_5k.npy'))\n",
    "pseudo_X=pd.concat((train_data,test_data))\n",
    "pseudo_X=pseudo_X.reset_index(drop=True)\n",
    "pseudo_y=pd.concat((y,pseudo_label))\n",
    "pseudo_y=pseudo_y.reset_index(drop=True)\n",
    "y=pseudo_y\n",
    "train_data=pseudo_X\n",
    "\n",
    "'''\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 968,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train,x_test,y_train,y_test=train_test_split(train_data,y,test_size=0.1,random_state=2020)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 969,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((3257, 38), (362, 38))"
      ]
     },
     "execution_count": 969,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_train.shape,x_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 970,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "val_mse: 2.172651e+03\n",
      "train_mse: 2.027569e+00\n"
     ]
    }
   ],
   "source": [
    "llf=gbm = lgb.LGBMRegressor(objective='regression',\n",
    "                        num_leaves=31,\n",
    "                        learning_rate=0.1,\n",
    "                        n_estimators=1000)\n",
    "\n",
    "llf.fit(x_train,y_train)\n",
    "\n",
    "llf_val_mse=mean_squared_error(y_test,llf.predict(x_test))\n",
    "llf_train_mse=mean_squared_error(y_train,llf.predict(x_train))\n",
    "print('val_mse:','{:e}'.format(llf_val_mse))\n",
    "print('train_mse:','{:e}'.format(llf_train_mse))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 971,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第1次验证mse误差为1266.294991\n",
      "第2次验证mse误差为800.564648\n",
      "第3次验证mse误差为700.657593\n",
      "第4次验证mse误差为1530.051113\n",
      "第5次验证mse误差为1152.972464\n",
      "平均验证误差1090.108162\n"
     ]
    }
   ],
   "source": [
    "details=[]\n",
    "answers=np.zeros(len(test))\n",
    "n_splits=5\n",
    "cnt=0\n",
    "mean_error=0\n",
    "sk=KFold(n_splits=n_splits,shuffle=True,random_state=2020)\n",
    "for train_k,test_k in sk.split(train_data,y):\n",
    "    cnt+=1\n",
    "    x_train=train_data.iloc[train_k]\n",
    "    y_train=y.iloc[train_k]\n",
    "    x_test=train_data.iloc[test_k]\n",
    "    y_test=y.iloc[test_k]\n",
    "    llf.fit(x_train,y_train)\n",
    "    error=mean_squared_error(y_test,llf.predict(x_test))\n",
    "    print(\"第%d次验证mse误差为%f\" %(cnt,error))\n",
    "    mean_error+=error/n_splits\n",
    "    test_lgb=llf.predict(test_data)\n",
    "    answers+=test_lgb/n_splits\n",
    "print(\"平均验证误差%f\"%mean_error)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 观察训练/验证过程"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 观察预测结果的分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 972,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "预测的最长时间:36.659695371021115 day\n",
      "预测的最短时间:0.6236526555497884 day\n",
      "预测的平均时间:14.249728726451485 day\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "##观察下预测结果的分布\n",
    "re_day=answers/24\n",
    "name_cnt={}#{订单号：对应的事件记录条数}\n",
    "tmp=[]\n",
    "print(\"预测的最长时间:%s day\"%(np.max(re_day)))\n",
    "print(\"预测的最短时间:%s day\"%np.min(re_day))\n",
    "print(\"预测的平均时间:%s day\"%np.mean(re_day))\n",
    "#画出分布直方图\n",
    "import pylab as plt \n",
    "bins = np.linspace(int(min(re_day)),int(max(re_day)),int(max(re_day)))\n",
    "plt.hist(re_day,bins)\n",
    "plt.xlabel('ETA of orders ')\n",
    "plt.ylabel('Number of orders')\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 973,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "预测的最长时间:37.02103935185185 day\n",
      "预测的最短时间:0.4782069444444444 day\n",
      "预测的平均时间:14.953154671547331 day\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEGCAYAAABiq/5QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAUkUlEQVR4nO3dfbAldX3n8feHgSyEYAQZJpMgjrLELOUDuiO7CYbwIBYrERAXlM0mA0VlrK2YxUp214nJagi1lTGJVkwltalxNU6MIviAEDBBMjq4JilggOEpoBB3dJXZmYkm4aHUBPjuH91XDsO9d3out8859/b7VXXrnP6d06e/9zd3Prfvr7t/napCkjQcB0y6AEnSeBn8kjQwBr8kDYzBL0kDY/BL0sAcOOkCujjyyCNrzZo1ky5DkpaU22677e+qauXe7Usi+NesWcO2bdsmXYYkLSlJvjpbu0M9kjQwBr8kDYzBL0kDY/BL0sAY/JI0MAa/JA2MwS9JA2PwS9LAGPySNDBL4srd5WDNhuvnfX3HxrPGVImkoes1+JPsAB4BngAer6q1SY4ArgTWADuAC6rq7/usQ5L0lHEM9ZxaVSdU1dp2eQOwpaqOA7a0y5KkMZnEGP85wOb2+Wbg3AnUIEmD1XfwF/DZJLclWd+2raqqnQDt41GzrZhkfZJtSbbt2bOn5zIlaTj6Prh7UlU9lOQo4MYk93ddsao2AZsA1q5dW30VKElD0+sef1U91D7uBq4GTgR2JVkN0D7u7rMGSdLT9Rb8SQ5NctjMc+C1wD3AtcC69m3rgGv6qkGS9Ex9DvWsAq5OMrOdj1bVnye5FbgqySXA14Dze6xBkrSX3oK/qr4CvHyW9m8Cp/e1XUnS/JyyQZIGxuCXpIEx+CVpYAx+SRoYg1+SBsbgl6SBMfglaWAMfkkaGINfkgbG4JekgTH4JWlgDH5JGhiDX5IGxuCXpIEx+CVpYAx+SRoYg1+SBsbgl6SBMfglaWAMfkkaGINfkgbG4JekgTH4JWlgDH5JGhiDX5IGxuCXpIEx+CVpYAx+SRoYg1+SBsbgl6SBMfglaWB6D/4kK5LckeS6dvmIJDcmeaB9PLzvGiRJTxnHHv+lwH0jyxuALVV1HLClXZYkjUmvwZ/kaOAs4H+NNJ8DbG6fbwbO7bMGSdLT9b3H/7vAfwOeHGlbVVU7AdrHo2ZbMcn6JNuSbNuzZ0/PZUrScPQW/El+GthdVbctZP2q2lRVa6tq7cqVKxe5OkkargN7/OyTgLOTvA44GHhOkj8BdiVZXVU7k6wGdvdYgyRpL73t8VfVr1TV0VW1Bngz8Lmq+o/AtcC69m3rgGv6qkGS9EyTOI9/I3BGkgeAM9plSdKY9DnU8z1VtRXY2j7/JnD6OLYrSXomr9yVpIEx+CVpYAx+SRoYg1+SBsbgl6SBMfglaWD2K/iTHJ7kZX0VI0nq3z6DP8nWJM9JcgRwJ/BHSd7bf2mSpD502eP/wap6GDgP+KOq+tfAa/otS5LUly7Bf2A7mdoFwHU91yNJ6lmX4L8MuAF4sKpuTfIi4IF+y5Ik9WXeuXqSrACeX1XfO6BbVV8B3th3YZKkfsy7x19VTwBnj6kWSdIYdJmd86+S/D5wJfDYTGNV3d5bVZKk3nQJ/p9oH39jpK2A0xa/HElS3/YZ/FV16jgKkSSNR5cLuFYl+UCSP2uXj09ySf+lSZL60OV0zg/RnM75w+3yl4G39VWQJKlfXYL/yKq6CngSoKoeB57otSpJUm+6BP9jSZ5Hc0CXJP8W+Mdeq5Ik9abLWT2/BFwLHJvkL4GVwL/vtSpJUm+6nNVze5KfAl4MBPhSVf1z75VJknoxZ/AnOW+Ol340CVX1qZ5qkiT1aL49/te3j0fRXMT1uXb5VGArYPBL0hI0Z/BX1cUASa4Djq+qne3yauAPxlOeJGmxdTmrZ81M6Ld2AT/aUz2SpJ51Oatna5IbgCtoTul8M/D5XquSJPWmy1k9b03yBuDktmlTVV3db1mSpL7s60YsBwB3VdVLAMNekpaBfd2I5UngziTHjKkeSVLPuozxrwbuTXILT78Ri3fmkqQlqEvwX9Z7FZKksdnn6ZxVdRNwP3BY+3Vf2zavJAcnuSXJnUnuTXJZ235EkhuTPNA+Hv5svwlJUnddbsRyAXALcD5wAXBzki6TtH0XOK2qXg6cAJzZzuy5AdhSVccBW9plSdKYdBnq+VXgVVW1GyDJSuAvgE/Mt1JVFfBou3hQ+1XAOcApbftmmukf3r6fdUuSFqjLlbsHzIR+65sd1yPJiiTbgd3AjVV1M7Bq5krg9vGoOdZdn2Rbkm179uzpsjlJUgddAvzPk9yQ5KIkFwHXA5/p8uFV9URVnQAcDZyY5CVdC6uqTVW1tqrWrly5sutqkqR96HLl7n9tp2h+Nc18/Pt95W5V/UOSrcCZwK4kq6tqZzvh2+7515YkLaYuY/wzc+/v1zTM7bGAf25D/xDgNcC7ae7mtQ7Y2D5es18VS5KelU7Bv0Crgc1JVtAMKV1VVdcl+WvgqiSXAF+jOVtIkjQmvQV/Vd0FvGKW9m8Cp/e1XUnS/OY8uJtkS/v47vGVI0nq23x7/Kvbm6yfneRjNAd2v6eqbu+1MklSL+YL/nfSXFV7NPDevV4r4LS+ipIk9We+e+5+AvhEkv9eVZePsSZJUo+6nMd/eZKzeeoOXFur6rp+y5Ik9aXLJG2/CVwK/E37dWnbJklagrqcznkWcEJ7Ny6SbAbuAH6lz8IkSf3oNNka8NyR5z/YRyGSpPHossf/m8AdST5Pc0rnybi3L0lLVpeDu1e0E6y9iib4315V/6/vwiRJ/eg6SdtOmsnVJElLXNcxfknSMmHwS9LAzBv8SQ5Ics+4ipEk9W/e4G/P3b8zyTFjqkeS1LMuB3dXA/cmuQV4bKaxqs7urSpJUm+6BP9lvVchSRqbLufx35TkBcBxVfUXSb4fWNF/aZKkPuwz+JP8PLAeOAI4FvgR4A/x9onSkrJmw/Xzvr5j41ljqkST1uV0zl8ATgIeBqiqB4Cj+ixKktSfLsH/3ar6p5mFJAfS3IFLkrQEdQn+m5K8AzgkyRnAx4E/7bcsSVJfugT/BmAPcDfwFuAzwK/1WZQkqT9dzup5sr35ys00QzxfqiqHeiRpiepyVs9ZNGfx/C3NtMwvTPKWqvqzvouTJC2+LhdwvQc4taoeBEhyLHA9YPBL0hLUJfh3z4R+6yvA7p7qkbQA+zpHXxo1Z/AnOa99em+SzwBX0Yzxnw/cOobaJEk9mG+P//Ujz3cBP9U+3wMc3ltFkqRezRn8VXXxOAuRJI1Hl7N6Xgj8IrBm9P1OyyxJS1OXg7ufBj5Ac7Xuk10/OMnzgT8Gfqhdb1NVvS/JEcCVNL9IdgAXVNXf71/ZkqSF6hL836mq31vAZz8O/HJV3Z7kMOC2JDcCFwFbqmpjkg00Vwa/fQGfL0lagC7B/74k7wI+C3x3prGqbp9vparaCexsnz+S5D6aKZ3PAU5p37YZ2IrBL0lj0yX4Xwr8LHAaTw31VLvcSZI1wCtopn1Y1f5SoKp2JnGKZ0kaoy7B/wbgRaNTM++PJD8AfBJ4W1U9nKTreutpbgDDMcd4r3dJWixdZue8E3juQj48yUE0of+RqvpU27wryer29dXMcRVwVW2qqrVVtXblypUL2bwkaRZd9vhXAfcnuZWnj/HPezpnml37DwD3VdV7R166FlgHbGwfr9nfoiVJC9cl+N+1wM8+iebYwN1Jtrdt76AJ/KuSXAJ8jWYKCEnSmHSZj/+mhXxwVX2RZhrn2XijdkmakC5X7j7CU/fY/T7gIOCxqnpOn4VJkvrRZY//sNHlJOcCJ/ZWkSSpV13O6nmaqvo0+3EOvyRpunQZ6jlvZPEAYC1PDf1IkpaYLmf1jM7L/zjNxGrn9FKNJKl3Xcb4nZdfkpaR+W69+M551ququryHeiRJPZtvj/+xWdoOBS4BngcY/JK0BM1368X3zDxv59O/FLgY+BjwnrnWkyRNt3nH+Nu7Zf0S8DM0c+e/0rtlSdLSNt8Y/28D5wGbgJdW1aNjq0qS1Jv5LuD6ZeCHgV8DHkrycPv1SJKHx1OeJGmxzTfGv99X9UqSpp/hLkkDY/BL0sAY/JI0MAa/JA2MwS9JA2PwS9LAGPySNDAGvyQNjMEvSQNj8EvSwBj8kjQwBr8kDYzBL0kDY/BL0sAY/JI0MAa/JA2MwS9JA2PwS9LAGPySNDC9BX+SDybZneSekbYjktyY5IH28fC+ti9Jml2fe/wfAs7cq20DsKWqjgO2tMuSpDHqLfir6gvAt/ZqPgfY3D7fDJzb1/YlSbMb9xj/qqraCdA+HjXXG5OsT7ItybY9e/aMrUBJWu6m9uBuVW2qqrVVtXblypWTLkeSlo1xB/+uJKsB2sfdY96+JA3euIP/WmBd+3wdcM2Yty9Jg9fn6ZxXAH8NvDjJ15NcAmwEzkjyAHBGuyxJGqMD+/rgqrpwjpdO72ubkqR9m9qDu5Kkfhj8kjQwBr8kDYzBL0kDY/BL0sAY/JI0ML2dzjk0azZcP+kS1IN9/bvu2HjWmCpZHrr8P7FP++cevyQNjMEvSQNj8EvSwDjGPyUc+5Q0Lu7xS9LAGPySNDAGvyQNjGP8DOscfM9Lf8qQ/t278DjTcLjHL0kDY/BL0sAY/JI0MAa/JA3Msj+46wE89WloB0Q9OWBxTernxz1+SRoYg1+SBsbgl6SBWfZj/Fp8S2Wcd1qO7yxGf03L9zIOS+Xnaylzj1+SBsbgl6SBMfglaWAc419GFmMceFxjyUMas94X+2L/LEZ/Df04gXv8kjQwBr8kDYzBL0kD4xj/EuJYsKadP6NPN639MZE9/iRnJvlSkgeTbJhEDZI0VGMP/iQrgD8A/h1wPHBhkuPHXYckDdUk9vhPBB6sqq9U1T8BHwPOmUAdkjRIkxjj/xHg/44sfx34N3u/Kcl6YH27+GiSLy1we0cCf7fAdcdlWdWYd/dcyfyWVV9O0LKucYw/o8+6H59lrS+YrXESwZ9Z2uoZDVWbgE3PemPJtqpa+2w/p0/WuHiWQp3WuDisceEmMdTzdeD5I8tHAw9NoA5JGqRJBP+twHFJXpjk+4A3A9dOoA5JGqSxD/VU1eNJ3grcAKwAPlhV9/a4yWc9XDQG1rh4lkKd1rg4rHGBUvWM4XVJ0jLmlA2SNDAGvyQNzLIO/qUwNUSSHUnuTrI9ybZJ1wOQ5INJdie5Z6TtiCQ3JnmgfTx8Cmv89STfaPtye5LXTbjG5yf5fJL7ktyb5NK2fWr6cp4ap6Yvkxyc5JYkd7Y1Xta2T1M/zlXj1PTjqGU7xt9ODfFl4AyaU0hvBS6sqr+ZaGF7SbIDWFtVU3OxTJKTgUeBP66ql7RtvwV8q6o2tr9ED6+qt09Zjb8OPFpVvzOpukYlWQ2srqrbkxwG3AacC1zElPTlPDVewJT0ZZIAh1bVo0kOAr4IXAqcx/T041w1nsmU9OOo5bzH79QQC1RVXwC+tVfzOcDm9vlmmnCYmDlqnCpVtbOqbm+fPwLcR3Pl+tT05Tw1To1qPNouHtR+FdPVj3PVOJWWc/DPNjXEVP1Atwr4bJLb2mkqptWqqtoJTVgAR024nrm8Ncld7VDQRIejRiVZA7wCuJkp7cu9aoQp6sskK5JsB3YDN1bV1PXjHDXCFPXjjOUc/J2mhpgCJ1XVK2lmK/2FdghDC/M/gWOBE4CdwHsmW04jyQ8AnwTeVlUPT7qe2cxS41T1ZVU9UVUn0Fzpf2KSl0yyntnMUeNU9eOM5Rz8S2JqiKp6qH3cDVxNM0Q1jXa148Ez48K7J1zPM1TVrvY/35PA+5mCvmzHez8JfKSqPtU2T1VfzlbjNPYlQFX9A7CVZux8qvpxxmiN09qPyzn4p35qiCSHtgfUSHIo8FrgnvnXmphrgXXt83XANROsZVYzIdB6AxPuy/aA3weA+6rqvSMvTU1fzlXjNPVlkpVJnts+PwR4DXA/09WPs9Y4Tf04atme1QPQnjr1uzw1NcT/mHBJT5PkRTR7+dBMn/HRaagxyRXAKTRTyu4C3gV8GrgKOAb4GnB+VU3s4OocNZ5C8yd1ATuAt8yMAU9CklcD/xu4G3iybX4HzRj6VPTlPDVeyJT0ZZKX0Ry8XUGzs3pVVf1GkucxPf04V40fZkr6cdSyDn5J0jMt56EeSdIsDH5JGhiDX5IGxuCXpIEx+CVpYAx+LVlJnhiZ9XB7kg1Jrm6fP5jkH0de+4l2nTvbU0H3d1srk9yc5I4kP7kItZ+S5Lpn+znSQoz91ovSIvp2e4n8MyQ5BfgvVfXTI23/imZn5+Qkh1bVY/uxrdOB+6tq3T7fOXs9K6rqiYWs265/YFU9vtD1pVHu8WtI/gPwYeCzwNmzvSHJC5JsaSfV2pLkmCQnAL8FvK796+GQvdY5vf1L4O52Iq5/0bbvSPLOJF8Ezk9zf4j72+XzRtY/tF3v1vZzzmnbL0ry8SR/SjOR3+okX2hruGcx/vLQMBn8WsoO2Wuo5037eP+bgCuBK2iuTJ3N79PM8f8y4CPA71XVduCdwJVVdUJVfXvmzUkOBj4EvKmqXkrzV/R/Gvm871TVq2mufH4/8HrgJ4EfGnnPrwKfq6pXAacCv91O4QHw48C6qjqN5hfXDe1fOS8Htu/j+5VmZfBrKft2G8QzX1fO9cYkrwL2VNVXgS3AK+eYIvfHgY+2zz8MvHofNbwY+D9V9eV2eTMwOsPqTE0/1r7vgWoul/+Tkfe8FtjQTum7FTiYZhoCaKb3nZmG4Fbg4jQ3nHlpO3++tN8Mfg3FhcCPpbnj2d8CzwHe2GG9fc1pMtv036NGjyPM9VkB3jjyC+yYqrpv7/Xbm8+cDHwD+HCSn9vHtqVZGfxa9pIcAJwPvKyq1lTVGpq7N8023PNXNDO5AvwMzS305nM/sCbJv2yXfxa4aY73vTDJse3y6LZvAH6xnSmTJK+Y4/t4AbC7qt5PM6PmK/dRmzQrg19L2d5j/BvneN/JwDeq6hsjbV8Ajt9r2lyA/0wznHIXTYhfOl8BVfUd4GLg40lmZrj8wznetx64vj24+9WRly+nuVXfXWluHn/5HJs7Bdie5A6av1beN19t0lycnVOSBsY9fkkaGINfkgbG4JekgTH4JWlgDH5JGhiDX5IGxuCXpIH5/1Mec4wyiJ1xAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "##观察下ans6k结果的分布\n",
    "ans1_5k=np.load('../submit/1_5k.npy')\n",
    "re_day=ans1_5k/24\n",
    "name_cnt={}#{订单号：对应的事件记录条数}\n",
    "tmp=[]\n",
    "print(\"预测的最长时间:%s day\"%(np.max(re_day)))\n",
    "print(\"预测的最短时间:%s day\"%np.min(re_day))\n",
    "print(\"预测的平均时间:%s day\"%np.mean(re_day))\n",
    "#画出分布直方图\n",
    "import pylab as plt \n",
    "bins = np.linspace(int(min(re_day)),int(max(re_day)),int(max(re_day)))\n",
    "plt.hist(re_day,bins)\n",
    "plt.xlabel('ETA of orders ')\n",
    "plt.ylabel('Number of orders')\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 974,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "answer与ans1_5k的mse:3756\n",
      "answer与ans_10k的mse:3490\n",
      "answer与ans6_9k的mse:5551\n",
      "ans_10k与ans1_5k的mse:4251\n",
      "ans6_9k与ans1_5k的mse:3302\n"
     ]
    }
   ],
   "source": [
    "#\n",
    "ans1_5k=np.load('../submit/1_5k.npy')\n",
    "ans_10k=np.load('../submit/ans_10k.npy')\n",
    "ans6_9k=np.load('../submit/rxd_6k9.npy')\n",
    "print(\"answer与ans1_5k的mse:%.0f\"%mean_squared_error(answers,ans1_5k))\n",
    "print(\"answer与ans_10k的mse:%.0f\"%mean_squared_error(answers,ans_10k))\n",
    "print(\"answer与ans6_9k的mse:%.0f\"%mean_squared_error(answers,ans6_9k))\n",
    "print(\"ans_10k与ans1_5k的mse:%.0f\"%mean_squared_error(ans1_5k,ans_10k))\n",
    "print(\"ans6_9k与ans1_5k的mse:%.0f\"%mean_squared_error(ans1_5k,ans6_9k))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "SZ109188860665 1.0\n",
    "NH240192470616 3.0\n",
    "JB123387157454 3.0\n",
    "ZO975754571124 3.0\n",
    "DH829189593918 105.0\n",
    "86 105.0\n",
    "LE381377964668 68.0\n",
    "95 68.0\n",
    "ZX552539758501 1.0\n",
    "TB846768731403 4.0\n",
    "HQ193237808500 1.0\n",
    "QK696918637480 8.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 937,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-24.443874691245107, 7.164669511975632)"
      ]
     },
     "execution_count": 937,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "answers[80],answers[89]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 938,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "8\n",
      "61\n",
      "126\n",
      "133\n",
      "135\n",
      "137\n",
      "152\n",
      "174\n",
      "177\n",
      "178\n"
     ]
    }
   ],
   "source": [
    "tmp=abs(answers-ans1_5k)\n",
    "for i in range(len(tmp)):\n",
    "    if tmp[i]>200:\n",
    "        print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 939,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "HB956271385453\n",
      "JV646262964847\n",
      "XW126071516605\n",
      "QX924743867365\n"
     ]
    }
   ],
   "source": [
    "grouped=df_test.groupby('loadingOrder',sort=False)\n",
    "cnt=0\n",
    "for name,group in grouped:\n",
    "    if cnt in [133,135,152,174]:\n",
    "        print(name)\n",
    "    cnt+=1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征重要度筛选"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 940,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Figure size 1296x648 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(18,9))\n",
    "lgb.plot_importance(llf,max_num_features=36)\n",
    "plt.title('lightgbm——feature_importances_',fontsize=14)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 941,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['lat_1_4', 'anchor_ratio', 'lon_max', 'direction_3_4', 'ex',\n",
       "       'k_median', 'lon_dis', 'direction_1_4', 'sy', 'k_3_4',\n",
       "       'direction_max', 'ey', 'speed_mean', 'dis', 'k_1_4', 'sx',\n",
       "       'lat_dis', 'dir_k', 'cal_speed'], dtype=object)"
      ]
     },
     "execution_count": 941,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "importance=pd.DataFrame({\n",
    "        'column': train_data.columns,\n",
    "        'importance': llf.booster_.feature_importance(),\n",
    "    }).sort_values(by='importance')\n",
    "importance=importance.reset_index(drop=True)\n",
    "importance['column'].values[20:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 生成提交文件"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "DH829189593918 105.0\n",
    "24 105.0\n",
    "LE381377964668 68.0\n",
    "87,68.0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 366,
   "metadata": {},
   "outputs": [],
   "source": [
    "test['label'] = answers\n",
    "result=test[['loadingOrder', 'label']]\n",
    "test_data_path = '../R2 ATest 0711Clean.csv'\n",
    "test_data=pd.read_csv(test_data_path)\n",
    "test_data=get_data(test_data, mode='test')\n",
    "#\n",
    "test_data = test_data.merge(result, on='loadingOrder', how='left')\n",
    "test_data['ETA'] = (test_data['onboardDate'] + test_data['label'].apply(lambda x:pd.Timedelta(hours=x))).apply(lambda x:x.strftime('%Y/%m/%d  %H:%M:%S'))\n",
    "test_data.drop(['direction','TRANSPORT_TRACE'],axis=1,inplace=True)\n",
    "test_data['onboardDate'] = test_data['onboardDate'].apply(lambda x:x.strftime('%Y/%m/%d  %H:%M:%S'))\n",
    "test_data['creatDate'] = pd.datetime.now().strftime('%Y/%m/%d  %H:%M:%S')\n",
    "test_data['timestamp'] = test_data['temp_timestamp']\n",
    "# 整理columns顺序\n",
    "submit = test_data[['loadingOrder', 'timestamp', 'longitude', 'latitude', 'carrierName', 'vesselMMSI', 'onboardDate', 'ETA', 'creatDate']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 370,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>loadingOrder</th>\n",
       "      <th>timestamp</th>\n",
       "      <th>longitude</th>\n",
       "      <th>latitude</th>\n",
       "      <th>carrierName</th>\n",
       "      <th>vesselMMSI</th>\n",
       "      <th>onboardDate</th>\n",
       "      <th>ETA</th>\n",
       "      <th>creatDate</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>28744</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T11:16:48.000Z</td>\n",
       "      <td>105.483728</td>\n",
       "      <td>3.496902</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28745</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T11:24:58.000Z</td>\n",
       "      <td>105.463333</td>\n",
       "      <td>3.462403</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28746</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T11:26:58.000Z</td>\n",
       "      <td>105.458357</td>\n",
       "      <td>3.454005</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28747</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T11:51:58.000Z</td>\n",
       "      <td>105.392875</td>\n",
       "      <td>3.350885</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28748</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T11:52:28.000Z</td>\n",
       "      <td>105.391335</td>\n",
       "      <td>3.348983</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28749</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T11:59:58.000Z</td>\n",
       "      <td>105.368168</td>\n",
       "      <td>3.320680</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28750</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T12:04:28.000Z</td>\n",
       "      <td>105.354298</td>\n",
       "      <td>3.303697</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28751</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T12:06:58.000Z</td>\n",
       "      <td>105.346595</td>\n",
       "      <td>3.294242</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28752</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T12:19:28.000Z</td>\n",
       "      <td>105.308082</td>\n",
       "      <td>3.246950</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28753</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T12:39:48.000Z</td>\n",
       "      <td>105.250933</td>\n",
       "      <td>3.165947</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28754</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T12:53:18.000Z</td>\n",
       "      <td>105.213820</td>\n",
       "      <td>3.111517</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28755</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T12:54:18.000Z</td>\n",
       "      <td>105.211348</td>\n",
       "      <td>3.107333</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28756</th>\n",
       "      <td>LE381377964668</td>\n",
       "      <td>2020-01-29T13:08:58.000Z</td>\n",
       "      <td>105.171773</td>\n",
       "      <td>3.047477</td>\n",
       "      <td>OIEQNT</td>\n",
       "      <td>Q4244189904</td>\n",
       "      <td>2020/01/26  15:01:58</td>\n",
       "      <td>2020/01/27  05:34:29</td>\n",
       "      <td>2020/08/02  18:06:27</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         loadingOrder                 timestamp   longitude  latitude  \\\n",
       "28744  LE381377964668  2020-01-29T11:16:48.000Z  105.483728  3.496902   \n",
       "28745  LE381377964668  2020-01-29T11:24:58.000Z  105.463333  3.462403   \n",
       "28746  LE381377964668  2020-01-29T11:26:58.000Z  105.458357  3.454005   \n",
       "28747  LE381377964668  2020-01-29T11:51:58.000Z  105.392875  3.350885   \n",
       "28748  LE381377964668  2020-01-29T11:52:28.000Z  105.391335  3.348983   \n",
       "28749  LE381377964668  2020-01-29T11:59:58.000Z  105.368168  3.320680   \n",
       "28750  LE381377964668  2020-01-29T12:04:28.000Z  105.354298  3.303697   \n",
       "28751  LE381377964668  2020-01-29T12:06:58.000Z  105.346595  3.294242   \n",
       "28752  LE381377964668  2020-01-29T12:19:28.000Z  105.308082  3.246950   \n",
       "28753  LE381377964668  2020-01-29T12:39:48.000Z  105.250933  3.165947   \n",
       "28754  LE381377964668  2020-01-29T12:53:18.000Z  105.213820  3.111517   \n",
       "28755  LE381377964668  2020-01-29T12:54:18.000Z  105.211348  3.107333   \n",
       "28756  LE381377964668  2020-01-29T13:08:58.000Z  105.171773  3.047477   \n",
       "\n",
       "      carrierName   vesselMMSI           onboardDate                   ETA  \\\n",
       "28744      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28745      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28746      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28747      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28748      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28749      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28750      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28751      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28752      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28753      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28754      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28755      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "28756      OIEQNT  Q4244189904  2020/01/26  15:01:58  2020/01/27  05:34:29   \n",
       "\n",
       "                  creatDate  \n",
       "28744  2020/08/02  18:06:27  \n",
       "28745  2020/08/02  18:06:27  \n",
       "28746  2020/08/02  18:06:27  \n",
       "28747  2020/08/02  18:06:27  \n",
       "28748  2020/08/02  18:06:27  \n",
       "28749  2020/08/02  18:06:27  \n",
       "28750  2020/08/02  18:06:27  \n",
       "28751  2020/08/02  18:06:27  \n",
       "28752  2020/08/02  18:06:27  \n",
       "28753  2020/08/02  18:06:27  \n",
       "28754  2020/08/02  18:06:27  \n",
       "28755  2020/08/02  18:06:27  \n",
       "28756  2020/08/02  18:06:27  "
      ]
     },
     "execution_count": 370,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "submit[submit['loadingOrder'].isin(['LE381377964668'])]#FA712454830300"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 371,
   "metadata": {},
   "outputs": [],
   "source": [
    "submit.to_csv('../submit/83v1.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 372,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.save('../submit/83v1.npy',answers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "huawei_copy",
   "language": "python",
   "name": "huawei_copy"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
